<?php
use app\common\model\AuthRule;
use app\common\model\ModuleClass;
use app\common\model\Arctype;
use app\common\model\Flink;
use app\common\model\Banner;
use app\common\model\Sparky;
use app\common\model\Archive;

/**
 * @Title: auth_rule_select
 * @Description: todo(权限节点)
 * @param string $module
 * @return array
 * @author 刀客源码 <654108442@qq.com>
 * @date 2019年5月12日
 * @throws
 */
function auth_rule_select($module){
    $authRuleModel = new AuthRule();
    $list = $authRuleModel->treeList($module, 1);
    $option = ['0' => lang('auth_rule_top')];
    if (!empty($list)){
        foreach ($list as $k => $v){
            if ($v['h_layer'] < 3){
                if ($v['h_layer'] > 1){
                    $lv = '　　├ ';
                }else{
                    $lv = '';
                }
                $option[$v['id']] = $lv.$v['title'];
            }
        }
    }
    return $option;
}

/**
 * @Title: auth_rule_check
 * @Description: todo(分配权限节点)
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function auth_rule_check($module){
    $authRuleModel = new AuthRule();
    $list = $authRuleModel->treeList($module, 1);
    $option = [];
    if (!empty($list)){
        foreach ($list as $k => $v){
            $option[$v['id']] = [$v['level'], $v['title']];
        }
    }
    return $option;
}

/**
 * @Title: module_class
 * @Description: todo(模块分类)
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function module_class($actions){
    $moduleClassModel = new ModuleClass();
    $list = $moduleClassModel->where([['status', '=', 1], ['actions', '=', $actions]])->order('sorts ASC,id ASC')->select();
    $option = [];
    if (!empty($list)){
        foreach ($list as $k => $v){
            $option[$v->id] = $v->title;
        }
    }
    return $option;
}

/**
 * @Title: arctyp_tree
 * @Description: todo(内容分类)
 * @return array
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function arctyp_tree(){
    $arctypeModel = new Arctype();
    $list = $arctypeModel->treeList();
    $option = [ '0' => lang('top_arctype')];
    if (!empty($list)){
        foreach ($list as $k => $v){
            if ($v['h_layer'] > 1){
                $lv = '';
                for ($i = 1; $i < $v['h_layer']; $i++){
                    $lv .= '　　';
                }
                $lv .= '├ ';
            }else{
                $lv = '';
            }
            $option[$v['id']] = $lv.$v['typename'];
        }
    }
    return $option;
}

/**
 * @Title: arctype_select_tree
 * @Description: todo(内容文章分类)
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function arctype_select_tree($mod){
    $arctypeModel = new Arctype();
    $list = $arctypeModel->treeList();
    $option[0] = ['val' => lang('choice_arctype'), 'disabled' => ''];
    if (!empty($list)){
        foreach ($list as $k => $v){
            if ($v['h_layer'] > 1){
                $lv = '';
                for ($i = 1; $i < $v['h_layer']; $i++){
                    $lv .= '　　';
                }
                $lv .= '├ ';
            }else{
                $lv = '';
            }
            if ($v['mod'] != $mod){
                $option[$v['id']] = ['val' => $lv.$v['typename'], 'disabled' => 'disabled="disabled"'];
            }else{
                $option[$v['id']] = ['val' => $lv.$v['typename'], 'disabled' => ''];
            }
        }
    }
    return $option;
}

/**
 * @Title: type_link
 * @Description: todo(分类链接URL)
 * @param array $arctype
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年10月9日
 * @throws
 */
function type_link($arctype){
    if ($arctype['mod'] == 'jump' && !empty($arctype['jumplink'])){
        $url = $arctype['jumplink'];
    }else{
        $url = '/index/category/'.$arctype['dirs'];
    }
    return $url;
}

/**
 * @Title: archive_link
 * @Description: todo(文档链接URL)
 * @param array $archive
 * @param string $mod
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年10月9日
 * @throws
 */
function archive_link($archive, $mod){
    $flag_arr = explode(',', $archive['flag']);
    if (in_array('j', $flag_arr) && isset($archive['jumplink']) && !empty($archive['jumplink'])){
        $url = $archive['jumplink'];
    }else{
        $url = '/index/detail/'.$mod.'/'.$archive['id'];
    }
    return $url;
}

/**
 * @Title: flag_pos
 * @Description: todo(文档属性)
 * @param string $flag
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年10月9日
 * @throws
 */
function flag_pos($flag){
    $flag_arr = explode(',', $flag);
    $flag = end($flag_arr);
    $flags = config('selectlist.flag')['data'];
    return '<div class="labels">'.$flags[$flag].'</div>';
}

/**
 * @Title: arc_tag
 * @Description: todo(文档标签)
 * @param string $tags
 * @author 刀客源码 <654108442@qq.com>
 * @date 2019年5月22日
 * @throws
 */
function arc_tag($tags){
    $res = '';
    $tags = explode(',', $tags);
    foreach ($tags as $k => $v){
        $res .= '<a href="'.url('@index/tags', ['tags' => $v]).'">'.$v.'</a>';
    }
    return $res;
}

/**
 * @Title: ajax_return
 * @Description: todo(ajax提交返回状态信息)
 * @param string $info
 * @param string $url
 * @param int $status
 * @param string $data
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年10月9日
 * @throws
 */
function ajax_return($info='', $url='', $status='', $data = ''){
    if(!empty($url)){
        if (is_object($url)){
            $url = $url->__toString();
        }
        $result = ['info' => lang('action_success'), 'status' => 1, 'url' => $url];
    }else{
        $result = ['info' => lang('action_fail'), 'status' => 0, 'url' => ''];
    }
    if($info !== ''){$result['info'] = $info;}
    if($status !== ''){$result['status'] = $status;}
    if(!empty($data)){$result['data'] = $data;}
    echo json_encode($result);
}

/**
 * @Title: del_arr_empty
 * @Description: todo(删除二维数组中的空值，保留0和false)
 * @param array $arr
 * @return array
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年10月9日
 * @throws
 */
function del_arr_empty($arr){
    foreach ($arr as $key => $value){
        if ($value == ''){
            unset($arr[$key]);
        }
    }
    return $arr;
}

/**
 * @Title: unset_array
 * @Description: todo(删除二维数组中的值)
 * @param string $str
 * @param array $arr
 * @return Array
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年10月9日
 * @throws
 */
function unset_array($str, $arr){
    foreach ($arr as $key => $value){
        if ($value === $str){
            unset($arr[$key]);
        }
    }
    return $arr;
}

/**
 * @Title: deldir
 * @Description: todo(删除文件-清理缓存)
 * @param string $dir
 * @param string $folder
 * @return boolean
 * @author 刀客源码 <654108442@qq.com>
 * @date 2016-5-24
 * @throws
 */
function deldir($dir, $folder='n'){
    //删除当前文件夹下得文件（并不删除文件夹）
    $dh=opendir($dir);
    while ($file=readdir($dh)) {
        if($file!="." && $file!="..") {
            $fullpath=$dir."/".$file;
            if(!is_dir($fullpath)) {
                unlink($fullpath);
            } else {
                deldir($fullpath,$folder);
            }
        }
    }
    closedir($dh);
    //删除当前文件夹
    if($folder=='y'){
        if(rmdir($dir)){
            return true;
        } else {
            return false;
        }
    }
}

/**
 * @Title: time_turn
 * @Description: todo(时间戳转换为时间格式 Y-m-d H:i:s)
 * @param int $time
 * @param string $format
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年10月9日
 * @throws
 */
function time_turn($time, $format='Y-m-d H:i:s'){
    if (empty($time) || $time == '' || $time == 0) {
        return '';
    }
    if (!is_numeric($time)){
        return $time;
    }
    return date($format, $time );
}

/**
 * @Title: time_line
 * @Description: todo(时间线)
 * @param int $time
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年2月6日
 * @throws
 */
function time_line($time){
    if (empty($time) || $time == '' || $time == 0) {
        return '';
    }
    if (!is_numeric($time)){
        $time = strtotime($time);
    }
    $rtime = $time;
    $time = time () - $time;
    if($time < 60){
        $str = $time.'秒之前';
    }elseif($time < 60*60){
        $min = floor( $time/60 );
        $str = $min.'分钟前';
    }elseif($time < 60*60*24){
        $h = floor($time/(60*60));
        $str = $h.'小时前 ';
    }elseif($time < 60*60*24*30) {
        $d = floor($time/(60*60*24));
        if ($d == 1)
            $str = $d.'天以前';
        else
            $str = $d.'天以前';
    }else{
        $str = date('Y-m-d', $rtime);
    }
    return $str;
}

/**
 * @Title: widget
 * @Description: todo(渲染输出widget挂件)
 * @param string $name
 * @param array $data
 * @author 刀客源码 <654108442@qq.com>
 * @date 2019年4月24日
 * @throws
 */
function widget($name, $data = []){
    $info   = pathinfo($name);
    $action = $info['basename'];
    $class = 'app\\'.$info['dirname'];
    $class = str_replace('common/', 'common\widget\\', $class);
    return app()->invokeMethod([$class, $action], $data);
}

/**
 * @Title: page_param
 * @Description: todo(分页额外参数)
 * @return array
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年10月9日
 * @throws
 */
function page_param(){
    $param = request()->param();
    $param = array_filter($param);
    if (isset($param['_pjax'])){
        unset($param['_pjax']);
    }
    $res['query'] = $param;
    return $res;
}

/**
 * @Title: search_url
 * @Description: todo(搜索的地址)
 * @param string $delparam
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年10月9日
 * @throws
 */
function search_url($delparam){
    $url_path = request()->baseUrl();
    $get = input('get.');
    $get = array_filter($get);
    $delparamArr = explode(',', $delparam);
    foreach ($get as $k => $v){
        if (in_array($k, $delparamArr)){
            unset($get[$k]);
        }
    }
    if( isset($get['_pjax'])){ unset($get['_pjax']); }
    if(!empty($get)){
        $paramStr = [];
        foreach ($get as $k=>$v){
            $paramStr[] = $k.'='.$v;
        }
        $paramStrs = implode('&', $paramStr);
        $url_path = $url_path.'?'.$paramStrs;
    }
    return $url_path;
}

/**
 * @Title: table_sort
 * @Description: todo(列表table排序)
 * @param string $param
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年10月9日
 * @throws
 */
function table_sort($param){
    $url_path = request()->baseUrl();
    $faStr = 'fa-sort';
    $get = request()->param();
    $get = array_filter($get);
    if( isset($get['_pjax']) ){ unset($get['_pjax']); }
    if( isset($get['_sort']) ){   //判断是否存在排序字段
        $sortArr = explode(',', $get['_sort']);
        if ( $sortArr[0] == $param ){   //当前排序
            if ($sortArr[1] == 'asc'){
                $faStr = 'fa-sort-asc';
                $sort = 'desc';
            }elseif ($sortArr[1] == 'desc'){
                $faStr = 'fa-sort-desc';
                $sort = 'asc';
            }
            $get['_sort'] = $param.','.$sort;
        }else{   //非当前排序
            $get['_sort'] = $param.',asc';
        }
    }else{
        $get['_sort'] = $param.',asc';
    }
    $paramStr = [];
    foreach ($get as $k=>$v){
        $paramStr[] = $k.'='.$v;
    }
    $paramStrs = implode('&', $paramStr);
    $url_path = $url_path.'?'.$paramStrs;
    return "<a class=\"fa ".$faStr."\" href=\"".$url_path."\"></a>";
}

/**
 * @Title: auth_action
 * @Description: todo(操作按钮权限)
 * @param string $rule 权限节点
 * @param string $cationType 按钮样式
 * @param string $info 按钮文字
 * @param array || string  $param 参数
 * @param string $color 颜色
 * @param string $size 大小
 * @param string $icon 图标
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年10月9日
 * @throws
 */
function auth_action($rule, $cationType='a', $info='infos', $param='', $color='primary', $size='xs', $icon='edit'){
    $auth = new \expand\Auth();
    $result = $auth->check($rule, ADMINID);
    if( $result ){
        $result = action_type($rule, $cationType, $info, $param, $color, $size, $icon);
    }
    return $result;
}

/**
 * @Title: action_type
 * @Description: todo(操作按钮样式)
 * @param string $rule
 * @param string $cationType
 * @param string $info
 * @param array || string  $param
 * @param string $color
 * @param string $size
 * @param string $icon
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2019年5月8日
 * @throws
 */
function action_type($rule, $cationType, $info, $param, $color, $size, $icon){
    switch ($cationType) {
        case "a":
            $res = "<a class=\"btn btn-".$color." btn-".$size."\" href=\"".url($rule, $param)."\"><i class=\"fa fa-".$icon."\"></i> ".$info."</a>";
            break;
        case "confirm":
            $res = "<a class=\"btn btn-".$color." btn-".$size." btn-confirm\" href=\"javascript:void(0);\" data-url=\"".url($rule)."\" data-id=\"".$param."\" data-title=\"".$info."\" ><i class=\"fa fa-".$icon."\"></i> ".$info."</a>";
            break;
        case "clean_cache":
            $res = "<li><a href=\"javacript:void(0);\" class=\"btn-confirm\" data-url=\"".url($rule)."\" data-id=\"".$param."\" data-title=\"".$info."\" ><i class=\"fa fa-".$icon."\"></i> ".$info."</a></li>";
            break;
        case "submit":
            $res = "<button type=\"submit\" class=\"btn btn-".$color." btn-".$size." submits\" data-loading-text=\"&lt;i class='fa fa-spinner fa-spin '&gt;&lt;/i&gt; ".$info."\">".$info."</button>";
            break;
    }
    return $res;
}

/**
 * @Title: list_status
 * @Description: todo(列表状态值切换)
 * @param int $id
 * @param string $value
 * @param string $field
 * @param string $action
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2019年5月11日
 * @throws
 */
function list_status($id, $value, $field='status', $action='edit'){
    if ($value == 1){
        $str = "fa-check-circle text-green";
    }else{
        $str = "fa-times-circle text-red";
    }
    return "<a href=\"javascript:void(0);\" data-id=\"".$id."\" data-field=\"".$field."\" data-value=\"".$value."\" data-url=\"".url($action)."\" class=\"editimg fa ".$str."\"></a>";
}

/**
 * @Title: list_write
 * @Description: todo(列表编辑文本)
 * @param array $data
 * @param string $field
 * @param string $action
 * @author 刀客源码 <654108442@qq.com>
 * @date 2019年5月17日
 * @throws
 */
function list_write($data, $field, $action='edit'){
    return "<span class=\"list-write\" data-id=\"".$data['id']."\" data-field=\"".$field."\" data-url=\"".url($action)."\" >".$data[$field]."</span>";
}

/**
 * @Title: whether
 * @Description: todo(测试用，没有任何用途)
 * @return string[]
 * @author 刀客源码 <654108442@qq.com>
 * @date 2019年4月25日
 * @throws
 */
function whether($a = ''){
    return ['1' => '是'.$a, '0' => '否'.$a];
}

/**
 * @Title: channelData
 * @Description: todo(当前pid的平级分类)
 * @param int $pid
 * @return array
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function channelData($pid){
    $arctypeModel = new Arctype();
    return $arctypeModel->channelData($pid);
}

/**
 * @Title: channel
 * @Description: todo(分类html)
 * @param int $pid
 * @param int $nowid
 * @param string $ishome
 * @param string $leftlabel
 * @param string $rightlabel
 * @param string $class
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function channel($pid=0, $nowid="", $ishome=0, $leftlabel="", $rightlabel="", $class=""){
    $arctypeModel = new Arctype();
    return $arctypeModel->channel($pid, $nowid, $ishome, $leftlabel, $rightlabel, $class);
}

/**
 * @Title: arctypeField
 * @Description: todo(分类字段)
 * @param int $id
 * @param string $key
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function arctypeField($id, $key){
    $arctypeModel = new Arctype();
    return $arctypeModel->arctypeField($id, $key);
}

/**
 * @Title: typename
 * @Description: todo(分类名称)
 * @param int $id
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function typename($id){
    $arctypeModel = new Arctype();
    return $arctypeModel->typename($id);
}

/**
 * @Title: typelink
 * @Description: todo(分类链接)
 * @param int $id
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function typelink($id){
    $arctypeModel = new Arctype();
    return $arctypeModel->typelink($id);
}

/**
 * @Title: position
 * @Description: todo(当前位置)
 * @param int $id
 * @param string $home
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function position($id, $home="首页"){
    $arctypeModel = new Arctype();
    return $arctypeModel->position($id, $home);
}

/**
 * @Title: arcLists
 * @Description: todo(查询分类下的文档)
 * @param int $typeid
 * @param int $limit
 * @param string $flag
 * @param string $order
 * @return array
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function arcLists($typeid, $limit=1, $flag='', $order='id DESC'){
    $arctypeModel = new Arctype();
    $mod = $arctypeModel->where('id', $typeid)->value('mod');
    if ($mod == 'page' || $mod == 'jump' || $mod == ''){
        return false;
    }
    $detailClass = 'app\common\model\\'.ucfirst($mod);
    $detailModel = new $detailClass;
    
    $typeid_arr = cache('ARCTYPE_ARR_'.$typeid);
    if(!$typeid_arr){
        $arctypeModel = new Arctype();
        $arctypeModel::$allChild = [];   //初始化无限子分类数组
        $typeid_arr = $arctypeModel->allChildArctype($typeid);
        cache('ARCTYPE_ARR_'.$typeid, $typeid_arr);
    }
    $where = [
            ['a.status', '=', 1],
            ['a.typeid', 'in', $typeid_arr],
    ];
    $dataList = $detailModel
    ->alias('a')
    ->join('member m', 'a.mid = m.id', 'left')
    ->field('a.*,m.name')
    ->where($where)
    ->where(function ($query) use($flag) {
        if (!empty($flag)){
            $flag_arr = explode(',', $flag);
            foreach($flag_arr as $k => $v){
                $query->whereFindInSet('flag', $v, 'or');
            }
        }
    })
    ->limit($limit)
    ->order($order)
    ->select();
    foreach ($dataList as $k => $v){
        $dataList[$k]['arctypeurl'] = type_link($v->arctype);
        $dataList[$k]['arcurl'] = archive_link($v, $mod);
    }
    return $dataList;
}

/**
 * @Title: prenext
 * @Description: todo(上一篇、下一篇)
 * @param array $detail
 * @return string
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function prenext($detail){
    $arctypeModel = new Arctype();
    $mod = $arctypeModel->where('id', $detail['typeid'])->value('mod');
    if ($mod == 'page' || $mod == 'jump' || $mod == ''){
        return false;
    }
    $detailClass = '\app\common\model\\'.ucfirst($mod);
    $detailModel = new $detailClass;
    
    $leftLabel = "<div class=\"ellipsis\">";
    $rightLabel = "</div>";
    $preStr = $leftLabel."<span>上一篇：</span>";
    $nextStr = $leftLabel."<span>下一篇：</span>";
    $where = [
            ['id', '>', $detail['id']],
            ['typeid', '=' , $detail['typeid']],
    ];
    $pre = $detailModel->where($where)->order('id ASC')->find();        //上一篇
    $where2 = [
            ['id', '<', $detail['id']],
            ['typeid', '=' , $detail['typeid']],
    ];
    $next = $detailModel->where($where2)->order('id DESC')->find();     //下一篇
    if(!empty($pre)){
        $preStr .= "<a href=\"".archive_link($pre, $mod)."\" title=\"".$pre['title']."\">".$pre['title']."</a>".$rightLabel;
    }else{
        $preStr .= "没有了".$rightLabel;
    }
    if(!empty($next)){
        $nextStr .= "<a href=\"".archive_link($next, $mod)."\" title=\"".$next['title']."\">".$next['title']."</a>".$rightLabel;
    }else{
        $nextStr .= "没有了".$rightLabel;
    }
    return $preStr.$nextStr;
}

/**
 * @Title: flinks
 * @Description: todo(友情链接)
 * @param int $mid
 * @param int $limit
 * @return array
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function flinks($mid, $limit=3){
    $flinkModel = new Flink();
    return $flinkModel->flinks($mid, $limit);
}

/**
 * @Title: banners
 * @Description: todo(banner链接)
 * @param int $mid
 * @param int $limit
 * @return array
 * @author 刀客源码 <654108442@qq.com>
 * @date 2018年11月9日
 * @throws
 */
function banners($mid, $limit=3){
    $bannerModel = new Banner();
    return $bannerModel->banners($mid, $limit);
}

/**
 * @Title: sparkys
 * @Description: todo()
 * @param int $mid
 * @param int $limit
 * @author 刀客源码 <654108442@qq.com>
 * @date 2019年5月23日
 * @throws
 */
function sparkys($mid, $limit=3){
    $sparkyModel = new Sparky();
    return $sparkyModel->sparkys($mid, $limit);
}

/**
 * @Title: archive_total
 * @Description: todo(文章总数)
 * @author 刀客源码 <654108442@qq.com>
 * @date 2019年5月27日
 * @throws
 */
function archive_total(){
    $archiveModel = new Archive();
    return $archiveModel->where('status', 1)->count();
}

/**
 * @Title: flink_total
 * @Description: todo(友情链接总数)
 * @author 刀客源码 <654108442@qq.com>
 * @date 2019年5月27日
 * @throws
 */
function flink_total(){
    $flinkModel = new Flink();
    return $flinkModel->where([['mid', '=', '2'], ['status', '=', '1']])->count();
}

/**
 * @Title: tags_list
 * @Description: todo(网站标签)
 * @return array
 * @author 刀客源码 <654108442@qq.com>
 * @date 2019年5月28日
 * @throws
 */
function tags_list(){
    $tags = cache('DB_TAGS_ARR');
    if(!$tags){
        $archiveModel = new Archive();
        $data = $archiveModel->field('keywords')->where('status', 1)->select();
        $str = '';
        foreach ($data as $k => $v){
            $str .= $v['keywords'].',';
        }
        $tags = del_arr_empty(array_unique(explode(',', $str)));
        shuffle($tags);
        cache('DB_TAGS_ARR', $tags);
    }
    return $tags;
}

/*
 *  检查钱包地址
 *  retrun bool
 * */
function checkWalletAddress($address){
    if(strlen($address) != 42 || substr($address,0,2) !== '0x'){
         return false;
    }
    return true;
}

/*
 *  获取百分比
 * */
function getRate($child, $parent,$decimal = 8){

    if($parent > 0){
        $rate = (round($child/$parent,$decimal))*100;
        if($rate > 100) $rate = 100;
    }
    return $rate ?? 0;
}

function returnData($msg = 'fail', $code = 0, $data = []){
    return ['code' => $code, 'msg' => $msg, 'data' => $data];
}

function number_to_normal($num, $double = 0){
    $num = strtolower($num);
    if(false !== stripos($num, "e")){
        $a = explode("e", strtolower($num));
        return bcmul($a[0], bcpow(10, $a[1], $double), $double);
    }
    return bcdiv($num, 1, $double);
}

function number_to_normal1($number)
{
    if(stripos($number, 'e') === false) {
        //判断是否为科学计数法
        return $number;
    }

    if(!preg_match(
        "/^([\\d.]+)[eE]([\\d\\-\\+]+)$/",
        str_replace(array(" ", ","), "", trim($number)), $matches)
    ) {
        //提取科学计数法中有效的数据，无法处理则直接返回
        return $number;
    }

    //对数字前后的0和点进行处理，防止数据干扰，实际上正确的科学计数法没有这个问题
    $data = preg_replace(array("/^[0]+/"), "", rtrim($matches[1], "0."));
    $length = (int)$matches[2];
    if($data[0] == ".") {
        //由于最前面的0可能被替换掉了，这里是小数要将0补齐
        $data = "0{$data}";
    }

    //这里有一种特殊可能，无需处理
    if($length == 0) {
        return $data;
    }

    //记住当前小数点的位置，用于判断左右移动
    $dot_position = strpos($data, ".");
    if($dot_position === false) {
        $dot_position = strlen($data);
    }

    //正式数据处理中，是不需要点号的，最后输出时会添加上去
    $data = str_replace(".", "", $data);


    if($length > 0) {
        //如果科学计数长度大于0

        //获取要添加0的个数，并在数据后面补充
        $repeat_length = $length - (strlen($data) - $dot_position);
        if($repeat_length > 0) {
            $data .= str_repeat('0', $repeat_length);
        }

        //小数点向后移n位
        $dot_position += $length;
        $data = ltrim(substr($data, 0, $dot_position), "0").".".substr($data, $dot_position);

    } elseif($length < 0) {
        //当前是一个负数

        //获取要重复的0的个数
        $repeat_length = abs($length) - $dot_position;
        if($repeat_length > 0) {
            //这里的值可能是小于0的数，由于小数点过长
            $data = str_repeat('0', $repeat_length).$data;
        }

        $dot_position += $length;//此处length为负数，直接操作
        if($dot_position < 1) {
            //补充数据处理，如果当前位置小于0则表示无需处理，直接补小数点即可
            $data = ".{$data}";
        } else {
            $data = substr($data, 0, $dot_position).".".substr($data, $dot_position);
        }
    }
    if($data[0] == ".") {
        //数据补0
        $data = "0{$data}";
    }
    return trim($data, ".");
}